package com.shuqing.download.engine.config;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 引擎配置信息，这个可以弄到配置文件里
 * @author wangshuqing
 * @date 2023/2/12 14:04
 */
@Data
@Configuration
public class EngineConfig {
    /**redis 队列没有任务时间隙休眠时间：毫秒**/
    private long gapSleepTills=5_000;
    /**数据库也不存在任务时：主线程休眠时间 ：毫秒*/
    private long sleepTills=30_000;

    //线程配置
    /**最大线程数**/
    @Value("${engine.config.pool.maxThreadCount:8}")
    private Integer maxThreadCount;
    /**最大任务数**/
    @Value("${engine.config.pool.maxTaskCount:9}")
    private Integer maxTaskCount;
    /**任务计数器**/
    private AtomicInteger maxTaskCountAtom;
    /**线程池：最大数**/
    @Value("${engine.config.pool.corePoolSize:5}")
    private Integer corePoolSize;
    //数据填充配置
    /***活跃时间:秒*/
    @Value("${engine.config.pool.threadKeepAliveSeconds:30}")
    private Integer threadKeepAliveSeconds;
    /**redis列队最大长度**/
    @Value("${engine.config.supplement.maxQueueCount:500}")
    private Integer maxQueueCount;
    /**redis队列补数的阈值**/
    @Value("${engine.config.supplement.supplementFillLimit:250}")
    private Integer supplementFillLimit;
    /**redis补数key值**/
    private String redisSupplementKey="download:supplement:lock";
    /**redis 补数数列**/
    private String redisSupplementData="download:supplement:data";
    /**redis 失效时间 秒**/
    private long redisExpireTimeOut=20;

    //导出配置
    /**默认每次读取目标数据的条数**/
    @Value("${engine.config.export.queryOncePageSize:5000}")
    private Integer queryOncePageSize;
    /**导出文件临时存放位置 ：这个文档地址必须是新建的**/
    @Value("${engine.config.export.fileSavePath:''}")
    private String exportFileSavePath;
    /**excel 单个sheet 最大行数**/
    @Value("${engine.config.export.maxOnceSheetSize:50000}")
    private Integer maxOnceSheetSize;
    /**最大 excel 条数**/
    @Value("${engine.config.export.maxExportDataSize:50000}")
    private Integer maxExportDataSize;
    /**清理临时文件的时间**/
    private long clearTempTimes=5*60*60*1000;
    /**导出格式默认配置**/
    private Format format;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Format{
        /**日期默认格式**/
        private String dateFormat;
    }

    @PostConstruct
    public void init(){
        format=new Format("yyyy-MM-dd HH:mm:ss");
        this.maxTaskCountAtom=new AtomicInteger(maxTaskCount);
    }
}
